package com.grupoconstruobras.sigo.security.audit;

import com.grupoconstruobras.sigo.core.ICoreNamingJndi;
import com.grupoconstruobras.sigo.core.context.ISessionContext;
import com.grupoconstruobras.sigo.security.audit.data.BaseBienesAuditEntity;
import com.grupoconstruobras.sigo.security.audit.data.IBienesAudit;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Logger;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;

public class BienesAuditorEntityListener implements IAuditorEntityListener {
	
	private static Logger LOG = Logger.getLogger(BienesAuditorEntityListener.class.getName());
	//@Inject
	private ISessionContext ctx;

	@PrePersist
	public void audit(Object bean) {
		ISessionContext ctx = null;
		try {
			Context jndi = new InitialContext();
			ctx = (ISessionContext) jndi.lookup(ICoreNamingJndi.GLOBAL + "sessionContext!" + ISessionContext.class.getName());
		} catch (NamingException e) {
			LOG.severe(e.getMessage());
		}
		
		if (bean instanceof IBienesAudit) {
			BaseBienesAuditEntity entity = (BaseBienesAuditEntity) bean;
			String user = ctx.getPrincipal().getName();
			Date auditDate = Calendar.getInstance().getTime();
			entity.setCreacionFecha(auditDate);
			entity.setCreacionUsuario(user);
			log(user, auditDate);
	    }
	}
	
	@PreUpdate
	public void update(Object bean) {
		ISessionContext ctx = null;
		try {
			Context jndi = new InitialContext();
			ctx = (ISessionContext) jndi.lookup(ICoreNamingJndi.GLOBAL + "sessionContext!" + ISessionContext.class.getName());
		} catch (NamingException e) {
			LOG.severe(e.getMessage());
		}
		
		if (bean instanceof IBienesAudit) {
			BaseBienesAuditEntity entity = (BaseBienesAuditEntity) bean;
			Date auditDate = Calendar.getInstance().getTime();
			String user = ctx.getPrincipal().getName();
			if (entity.getCreacionFecha() == null) {
				  entity.setCreacionFecha(auditDate);
			} else {
				  entity.setModificaFecha(auditDate);
			}
			if (entity.getCreacionUsuario() == null || entity.getCreacionUsuario().isEmpty()) {
			  entity.setCreacionUsuario(user);
			} else {
				entity.setModificaUsuario(user);
			}
		  log(user, auditDate);
		}
	}
	
	private void log(String user, Date auditDate) {
		DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		String date = format.format(auditDate);
		LOG.info(String.format("Registro actualizado por el usuario %s, con fecha %s", user, date));
	}
	
}
